


<!DOCTYPE html>
<html id="htmlId">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 
  <title>Coverage Report > AuthInterceptor</title>
  <style type="text/css">
    @import "../../css/coverage.css";
    @import "../../css/idea.min.css";
  </style>
  <script type="text/javascript" src="../../js/highlight.min.js"></script>
  <script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>

<body>
<div class="content">
<div class="breadCrumbs">
Current scope:     <a href="../../index.html">all classes</a>
    <span class="separator">|</span>
    <a href="../index.html">com.ie.common.security.intercept</a>
</div>

<h1>Coverage Summary for Class: AuthInterceptor (com.ie.common.security.intercept)</h1>

<table class="coverageStats">
<tr>
  <th class="name">Class</th>
<th class="coverageStat 
">
  Class, %
</th>
<th class="coverageStat 
">
  Method, %
</th>
<th class="coverageStat 
">
  Branch, %
</th>
<th class="coverageStat 
">
  Line, %
</th>
</tr>
<tr>
  <td class="name">AuthInterceptor</td>
<td class="coverageStat">
  <span class="percent">
    100%
  </span>
  <span class="absValue">
    (1/1)
  </span>
</td>
<td class="coverageStat">
  <span class="percent">
    66.7%
  </span>
  <span class="absValue">
    (2/3)
  </span>
</td>
<td class="coverageStat">
  <span class="percent">
    0%
  </span>
  <span class="absValue">
    (0/6)
  </span>
</td>
<td class="coverageStat">
  <span class="percent">
    11.8%
  </span>
  <span class="absValue">
    (2/17)
  </span>
</td>
</tr>

</table>

<br/>
<br/>


<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package com.ie.common.security.intercept;
&nbsp;
&nbsp;import cn.hutool.json.JSONUtil;
&nbsp;import com.ie.common.http.ResponseResult;
&nbsp;import com.ie.common.http.StatusCode;
&nbsp;
&nbsp;import com.ie.common.security.anno.AuthIgrone;
&nbsp;import com.ie.common.security.utils.HttpJwtTokenUtil;
&nbsp;import jakarta.servlet.http.HttpServletRequest;
&nbsp;import jakarta.servlet.http.HttpServletResponse;
&nbsp;import lombok.extern.slf4j.Slf4j;
&nbsp;import org.springframework.beans.factory.annotation.Autowired;
&nbsp;import org.springframework.stereotype.Component;
&nbsp;import org.springframework.web.method.HandlerMethod;
&nbsp;import org.springframework.web.servlet.HandlerInterceptor;
&nbsp;
&nbsp;import java.lang.annotation.Annotation;
&nbsp;
&nbsp;@Component
<b class="fc">&nbsp;@Slf4j</b>
&nbsp;@SuppressWarnings(&quot;all&quot;)
&nbsp;
&nbsp;/**
&nbsp; * @classname: AuthInterceptor
&nbsp; * @Author: xujia
&nbsp; * @Description: 实现HandlerInterceptor接口。HandlerInterceptor是Spring框架中的一个接口，用于拦截HTTP请求和响应，通常用于实现权限验证、日志记录等功能
&nbsp; * @Date: 2024/9/8  15:17
&nbsp; * @Param:
&nbsp; * @version: 1.0
&nbsp; **/
<b class="fc">&nbsp;public class AuthInterceptor implements HandlerInterceptor {</b>
&nbsp;    @Autowired
&nbsp;    private HttpJwtTokenUtil jwtHttpUtil;
&nbsp;    // private static final Logger log = LoggerFactory.getLogger(AuthInterceptor.class);
&nbsp;
&nbsp;    /**
&nbsp;     * preHandle主要用于处理HTTP请求前的预处理工作：
&nbsp;     * 记录请求开始的日志信息；
&nbsp;     * 检查处理器是否为HandlerMethod类型，若不是则直接返回true；
&nbsp;     * 获取方法上的AuthIgrone注解，如果存在该注解，则直接放行；
&nbsp;     * 使用jwtHttpUtil.validate方法验证请求的有效性，如果验证失败，则返回错误信息并阻止请求继续执行；否则放行请求。
&nbsp;     */
&nbsp;    @Override
&nbsp;    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
&nbsp;            throws Exception {
<b class="nc">&nbsp;        log.info(request.getRequestURI() + &quot; is start&quot;);</b>
<b class="nc">&nbsp;        log.info(&quot;拦截器已经启动&quot;);</b>
&nbsp;        // System.out.println(&quot;preHandle请求开始&quot;);
&nbsp;        // https://blog.csdn.net/tgy003/article/details/136520919
&nbsp;        // https://blog.csdn.net/alises1314/article/details/140528573
&nbsp;        // https://blog.csdn.net/alises1314/article/details/140528573
&nbsp;
&nbsp;        /**
&nbsp;         HandlerMethod 是 Spring 框架中的一个类，用于封装处理 HTTP 请求的方法。它通常与 Spring MVC 一起使用，用于处理控制器中的方法调用。HandlerMethod
&nbsp;         提供了关于控制器方法的信息，包括方法名、参数、返回类型等。
&nbsp;         实现原理
&nbsp;         HandlerMethod 通过反射机制获取控制器方法的信息。它包含以下主要部分：
&nbsp;         Controller 对象：表示处理请求的控制器实例。
&nbsp;         Method 对象：表示控制器中的具体方法。
&nbsp;         Bean 属性：表示控制器在 Spring 容器中的 Bean 名称。
&nbsp;         用途
&nbsp;         HandlerMethod 在 Spring MVC 中主要用于以下用途：
&nbsp;         请求映射：通过 HandlerMethod 可以获取到处理请求的方法，从而确定请求应该由哪个方法来处理。
&nbsp;         参数解析：HandlerMethod 可以解析方法参数，包括请求参数、请求头、请求体等。
&nbsp;         返回值处理：HandlerMethod 可以处理方法的返回值，并将其转换为合适的响应格式（如 JSON、XML 等）。
&nbsp;         拦截器支持：HandlerMethod 支持在方法执行前后添加拦截器，实现自定义的预处理和后处理逻辑。
&nbsp;         注意事项
&nbsp;         性能考虑：由于 HandlerMethod 使用反射机制，频繁创建 HandlerMethod 实例可能会影响性能。因此，通常在应用启动时创建并缓存 HandlerMethod 实例。
&nbsp;         安全性：在使用 HandlerMethod 时，需要注意确保控制器方法的安全性，避免潜在的安全漏洞，如 SQL 注入、XSS 攻击等。
&nbsp;         异常处理：在控制器方法中，应该合理处理可能出现的异常，避免未处理的异常导致应用崩溃。
&nbsp;         */
&nbsp;        // 如果handler不是HandlerMethod实例，直接返回
<b class="nc">&nbsp;        if (!(handler instanceof HandlerMethod)) {</b>
<b class="nc">&nbsp;            return true;</b>
&nbsp;        }
&nbsp;
<b class="nc">&nbsp;        HandlerMethod handlerMethod = (HandlerMethod) handler;</b>
<b class="nc">&nbsp;        Annotation authIgrone = handlerMethod.getMethodAnnotation(AuthIgrone.class);</b>
&nbsp;        /**
&nbsp;         * 从一个处理器方法（HandlerMethod）中获取一个特定的注解（Annotation），具体来说，是获取名为AuthIgrone的注解。下面是对这段代码的详细解释：
&nbsp;         * HandlerMethod:
&nbsp;         * HandlerMethod是Spring框架中的一个类，用于封装控制器方法的信息。它包含了方法本身、所属的控制器类、方法参数等信息。
&nbsp;         * 通过HandlerMethod对象，可以获取到控制器方法的各种元数据，如方法名、参数类型、返回类型等。
&nbsp;         * 获取处理器方法:
&nbsp;         * HandlerMethod handlerMethod = (HandlerMethod) handler;
&nbsp;         * 这行代码将handler对象强制转换为HandlerMethod类型。handler通常是一个处理器对象，可能是通过HandlerInterceptor拦截器获取的。
&nbsp;         * 获取方法注解:
&nbsp;         * Annotation authIgrone = handlerMethod.getMethodAnnotation(AuthIgrone.class);
&nbsp;         * 这行代码尝试从HandlerMethod对象中获取名为AuthIgrone的方法注解。getMethodAnnotation方法会返回一个Annotation对象，如果方法上存在AuthIgrone注解，
&nbsp;         * 则返回该注解实例；否则返回null。
&nbsp;         * 用途
&nbsp;         * 这段代码的用途通常是在Spring MVC框架中，用于在拦截器（Interceptor）或控制器（Controller）中检查某个方法是否被AuthIgrone注解标记。如果方法被标记，
&nbsp;         * 则可以跳过某些权限验证或授权逻辑。
&nbsp;         * 注意事项
&nbsp;         * 注解定义:
&nbsp;         * AuthIgrone注解需要在代码的其他地方定义。它应该是一个自定义注解，用于标记需要忽略权限验证的方法。
&nbsp;         * 类型转换:
&nbsp;         * handler对象必须是一个HandlerMethod实例，否则强制转换会抛出ClassCastException异常。通常，handler对象是通过拦截器传递的，确保传递的是正确的类型。
&nbsp;         * 空指针异常:
&nbsp;         * 如果方法上没有AuthIgrone注解，getMethodAnnotation方法会返回null。在使用authIgrone对象之前，应该进行null检查，以避免空指针异常。
&nbsp;         */
&nbsp;        // 无需签名,直接放行
<b class="nc">&nbsp;        if (authIgrone != null) {</b>
<b class="nc">&nbsp;            return true;</b>
&nbsp;        }
&nbsp;
<b class="nc">&nbsp;        boolean res = jwtHttpUtil.validate(request);</b>
<b class="nc">&nbsp;        if (!res) {</b>
<b class="nc">&nbsp;            log.info(&quot;验证失败&quot;);</b>
&nbsp;            // E001在前端未使用
<b class="nc">&nbsp;            ResponseResult&lt;Object&gt; rrs = ResponseResult.getMessageResult(null, &quot;E001&quot;, StatusCode.C405);</b>
<b class="nc">&nbsp;            response.getWriter().write(JSONUtil.toJsonStr(rrs));</b>
<b class="nc">&nbsp;            return false;</b>
&nbsp;        } else {
<b class="nc">&nbsp;            return true;</b>
&nbsp;        }
&nbsp;    }
&nbsp;}
&nbsp;/*
&nbsp; * 这段Java代码的主要功能是验证一个HTTP请求是否通过JWT（JSON Web Token）的验证，并根据验证结果返回相应的响应。下面是对代码的详细解释：
&nbsp; * JWT验证：
&nbsp; * boolean res = jwtHttpUtil.validate(request);
&nbsp; * 这行代码调用了jwtHttpUtil对象的validate方法，传入request对象，用于验证请求是否包含有效的JWT。validate方法返回一个布尔值res，表示验证结果
&nbsp; * （true表示验证通过，false表示验证失败）。
&nbsp; * 验证失败的处理：
&nbsp; * if(!res) {
&nbsp; *     ResponseResult&lt;Object&gt; rrs = ResponseResult.getMessageResult(null,&quot;E001&quot;, StatusCode.C405);
&nbsp; *     response.getWriter().write(JSONUtil.toJsonStr(rrs));
&nbsp; *     return false;
&nbsp; * }
&nbsp; * 如果验证失败（res为false），则执行以下操作：
&nbsp; * 创建一个ResponseResult对象rrs，该对象包含错误信息。getMessageResult方法接受三个参数：null（表示没有数据返回）、错误代码&quot;E001&quot;和状态码StatusCode.C405
&nbsp; * （表示方法不允许，通常用于表示客户端请求的方法不允许）。
&nbsp; * 使用response.getWriter().write(JSONUtil.toJsonStr(rrs))将rrs对象转换为JSON字符串，并通过response对象返回给客户端。
&nbsp; * 返回false，表示验证未通过。
&nbsp; * 验证通过的处理：
&nbsp; * return true;
&nbsp; * 如果验证通过（res为true），则直接返回true，表示验证通过。
&nbsp; * 用途： 这段代码通常用于保护需要认证的API端点，确保只有持有有效JWT的请求才能访问这些端点。如果请求没有通过JWT验证，服务器会返回一个错误响应，告知客户端请求被拒绝。
&nbsp; * 注意事项：
&nbsp; * jwtHttpUtil对象需要正确实现JWT验证逻辑，确保其validate方法能够正确验证请求中的JWT。
&nbsp; * ResponseResult和StatusCode类需要定义好，以便生成合适的响应结果。
&nbsp; * JSONUtil类用于将ResponseResult对象转换为JSON字符串，确保响应能够被客户端正确解析。
&nbsp; * 代码中假设request和response对象已经正确初始化，并且response.getWriter()方法可用。
&nbsp; */
</code>
</pre>
</div>

<script type="text/javascript">
(function() {
    var msie = false, msie9 = false;
    /*@cc_on
      msie = true;
      @if (@_jscript_version >= 9)
        msie9 = true;
      @end
    @*/

    if (!msie || msie && msie9) {
      hljs.highlightAll()
      hljs.initLineNumbersOnLoad();
    }
})();
</script>

<div class="footer">
    
    <div style="float:right;">generated on 2025-06-15 18:23</div>
</div>
</body>
</html>
